..:: Menu ::.. ..:: Lekcja 7: Piszemy instalator ::.. ..::Info i Reklamy::..

Budujemy instalatora

Przedstawię tutaj proces tworzenia instalatora. Będzie to instalator na własne potrzeby. Będzie on w jednym pliku EXE zawierał instalowane pliki. Wygląd samego instalatora pozostawiam Wam.
Oczywiście nasz instalator ma być w jednym pliku tak żeby nasz instalowany program "odklejał" się od EXEka i zapisywał w wybranym przez użytkownika katalogu.
Pewnie największym problemem było włączenie samego pliku do EXEka, prawda?
Dołączanie plików:
Przygotuj sobie najpierw jakiś katalog - załóżmy "Setup". Tam skopiuj pliki, które chcesz włączyć do EXEka. Ja w swoim przykładzie włączam tylko jeden plik wykonywalny EXE. Naszym celem będzie stworzenie zasobu zawierającego właśnie plik EXE, który chcesz zainstalować. W przykładzie, który podaje plik dołączony do zasobów nazywać się będzie "Pad.exe".
Najpierw stwórz plik tekstowy z zmień jego rozszerzenie na *.rc ( np. files.rc ). W Notatniku dopisz taką linię:
PAD RCDATA "Pad.exe"
README RCDATA "Readme.txt"
Pierwszy człon to nazwa programu, drugi to typ pliku - w tym wypadku jest to program, a ostatni człon podany w cudzysłowach to nazwa pliku wykonywalnego - w moim przypadku jest to "Pad.exe" oraz plik Readme "Readme.txt". Zapisz cały plik. Jeżeli posiadasz Delphi to z pewnością program "brcc32.exe". Znajduje się on w katalogu ...Delphi\Bin. Skopiuj go do katalogu z Twoimi plikami ( tam gdzie masz plik *.rc ).
Jest to program DOS-owy więc musisz uruchomić go z okienka MS -DOS. Ten program przekształci plik *.rc na *.res.
Odpal więc okienko MS - DOS-a i przejdź do katalogu z plikiem *.rc oraz z programem "brcc32.exe". W DOS-ie do katalogów przechodzi się poleceniem:
cd NazwaKatalogu
Jeżeli chcesz przejść o katalog wyżej to stosujesz polecenie:

cd..
A więc jeżeli już jesteś w tym katalogu to wpisz taką linię i wciśnij ENTER:

brcc32.exe files.rc
"Files.rc" to nazwa Twojego zasobu. Jeżeli wszystko pójdzie dobrze to obok pliku *.rc powinieneś ujrzeć plik z rozszerzeniem *.res.( w moim przypadku jest to plik o nazwie "files.RES". ). Gratulacje! Właśnie stworzyłeś zasób, który zawiera Twój plik EXE. Jest on zapewne dość duży ( w moim przypadku zajmuje 250 kB ).

Wyciągnięcie programu z EXEka.

Gdzieś w kodzie Twojego instalatora umieść taką linię:

{$R FILES.RES}

"Files.res" to Twoja nazwa zasobu. Od tej pory zasoby te są włączone do instalatora.
Pozostało jeszcze napisanie samej procedury, która wyciągnie z zasobów program i zapisze go gdzieś na dysku:
Wygląda ona tak:
procedure TMainFrm.InstallClick(Sender: TObject);
{
Rekord ten zawiera dwie pozycje. Pierwsza okresla tutul
instalowanego pliku, ktory okresliles podczas kompilacji
zasobow. Drugi to dokladna nazwa instalowanego pliku - np: Pad.exe
}
type
_DATA = record
Title: PChar;
FName: PChar;
end;
{
Stala okreslajaca tablice bazujaca na rekordzie. Tablica ta
zawiera dokladna nazwe pliku jaki bedzie stworzony podczas
instalacji oraz nazwa, ktora zostala podana podczas kompilacji
zasobow.
}
const
Files : array [0..1] of _DATA =
((Title: 'PAD'; FName: 'Pad.exe'),
(Title: 'README'; FName: 'Readme.txt'));
var
Res : TResourceStream;
I : Integer;
{
Procedura, korej tresc widzisz pokazuje wskaznik postepu
na pasku "Gauge". Jest to tylko tak dla "bajeru", aby pokazac
postep w kopiowaniu pliki :)
}
procedure Postep;
var
I : Integer;
begin
For I := 0 to 100 do // petla
begin
Application.ProcessMessages;
Sleep(3); // czekaj 3 milisekundy
Gauge.Progress := i;
end;
end;
begin
{
Jezeli ostatnim znamiem znajdujacym sie w "Dir" jest znak "\" to nie
rob nic. Jezeli jest inaczej dopisz ten znak na koncu tekstu.
}
if Dir.Text[Length(Dir.Text)] = '\' then
Dir.Text := Dir.Text else
Dir.Text := Dir.Text + '\';

For I := Low(Files) to High(Files) do
begin
Application.ProcessMessages; // daj odetchnac systemowi
Postep; // wywyolaj procedure
Res := TResourceStream.Create(hInstance, Files[i].Title, RT_RCDATA);
Res.SaveToFile(Dir.Text + Files[i].FName);// zapisz plik na dysku
Res.Free; // zwolnij zmienna
end;

MessageBox(Handle, 'Instalacja zakończona sukcesem :)', 'Informacja',
MB_OK + MB_ICONINFORMATION);
end;
Być może ta procedura wygląda trochę strasznie i trudno. Zastosowałem tutaj rekord oraz tablice, aby pokazać zastosowanie ich w praktyce. Powyższy kod zadziała wtedy gdy na formie umieścisz komponent "Gauge" odpowiedzialny za pokazywanie wskaźnika postępu. Znajdziesz go na palecie "Samples".
W przykładzie instalowane są dwa pliki. Gdy masz więcej niż dwa pliki to wystarczy, że do stałych "const" dopiszesz kolejne wartości odpowiadające za pliki. Jeżeli czegoś nie rozumiesz to pisz: boduch@poland.com
Zauważ, że w tym przykładzie procedura ( nowa ) została zadeklarowana jako zmienna w sekcji "var". Teraz może ona być wywoływana z każdego miejsca w danej procedurze. Procedura ta odpowiada za pokazywanie wskaźnika postępu ( tak dla bajeru ) żeby fajnie wyglądało ( tak jakby plik się naprawdę instalował ). Pierwszą rzeczą którą procedura robi po uruchomieniu jest sprawdzenie ostatniego znaku w kontrolce "Dir". Aha, kontrolka "Dir" to komponent "Edit". Sprawdzany jest czy ostatnim znakiem jest back-slash. Jeżeli nie to jest on dodawany na końcu. Następnie wywoływana jest pętla która instaluje wszystkie pliki. Jednocześnie z instalowaniem pliku wywoływana jest procedura "Postęp", która pokazuje postęp na komponencie "Gauge".
Przy końcu instalacji pokazywane jest okienko z informacją o zakończonej instalacji.

   
©Copyright by garUs